package com.xzr.demo.mqserver.core;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * 交换机
 * @Author：徐志荣
 * @Date：2023/8/3 下午 4:42
 */

@Data
public class Exchange {
    //此处使用 name 来作为交换机的身份标识，（唯一的）
    private String name;

    //交换机的类型 Direct,Fanout,Topic
    private ExchangeType type = ExchangeType.DIRECT;
    //该交换机是否持久化存储， true:持久化；false：不持久化
    private boolean durable = false;
    //如果当前交换机，没人使用了，就自动删除，并没有实现这个自动删除功能
    private boolean autoDelete = false;
    //arguments 表示的是 创建交换机时指定的一些额外的参数选项，后序代码中并没有真的实现对应的功能
    //为了把它存到数据库中， 就需要把Map转成JSON 字符串
    private Map<String,Object> arguments = new HashMap<>();

    /**
    * 此处的getter 和setter 用于 和数据库交互使用
    *
    * @return
    */

    public String getArguments() {
        // Map 转为 String（JSON）
        ObjectMapper objectMapper = new ObjectMapper();

        try {
           return objectMapper.writeValueAsString(arguments);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //异常 返回 空字符串
        return "{}";
    }

    /**
    * 这个方法，是从数据库读数据之后，构造Exchange对象
     * 将参数 解析 -> JSON
    * @param argumentsJson
    * @return
    */

    public void setArguments(String argumentsJson) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
          this.arguments = objectMapper.readValue(argumentsJson, new TypeReference<Map<String,Object>>() {
            });
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

    }

   /**
   *此处的getter 和setter 用于 java代码内部使用 -> 测试
    * 为了：更方便的获取/设置 这里的键值对
     * 提供一组 getter 和setter 方法
   * @param key
   * @return
   */
    public Object getArguments(String key){
        return arguments.get(key);
    }

    public void setArguments(String key,Object value) {
        arguments.put(key, value);
    }

    public void  setArguments(Map<String,Object> arguments){
        this.arguments = arguments;
    }

}
